pub struct Dependency {
name: String,
namespace: SourceId,
- req: VersionReq
+ req: VersionReq,
+ transitive: bool
}
impl Dependency {
Ok(Dependency {
name: name.to_str(),
namespace: namespace.clone(),
- req: version
+ req: version,
+ transitive: true
})
}
pub fn get_namespace<'a>(&'a self) -> &'a SourceId {
&self.namespace
}
+
+ pub fn as_dev(&self) -> Dependency {
+ let mut dep = self.clone();
+ dep.transitive = false;
+ dep
+ }
+
+ pub fn is_transitive(&self) -> bool {
+ self.transitive
+ }
}
#[deriving(PartialEq,Clone,Encodable)]
resolve.insert(pkg.get_name().to_str(), pkg.clone());
for dep in pkg.get_dependencies().iter() {
+ if !dep.is_transitive() { continue; }
+
if !resolve.contains_key_equiv(&dep.get_name()) {
remaining.push(dep.clone());
}
use core::{Dependency, PackageId, Summary};
use super::resolve;
- macro_rules! pkg(
- ($name:expr => $($deps:expr),+) => (
- {
+ trait ToDep {
+ fn to_dep(self) -> Dependency;
+ }
+
+ impl ToDep for &'static str {
+ fn to_dep(self) -> Dependency {
let url = url::from_str("http://example.com").unwrap();
let source_id = SourceId::new(RegistryKind, Remote(url));
- let d: Vec<Dependency> = vec!($($deps),+).iter().map(|s| {
- Dependency::parse(*s, Some("1.0.0"), &source_id).unwrap()
- }).collect();
+ Dependency::parse(self, Some("1.0.0"), &source_id).unwrap()
+ }
+ }
+
+ impl ToDep for Dependency {
+ fn to_dep(self) -> Dependency {
+ self
+ }
+ }
+
+ macro_rules! pkg(
+ ($name:expr => $($deps:expr),+) => ({
+ let d: Vec<Dependency> = vec!($($deps.to_dep()),+);
+
Summary::new(&PackageId::new($name, "1.0.0", ®istry_loc()).unwrap(),
d.as_slice())
- }
- );
+ });
($name:expr) => (
Summary::new(&PackageId::new($name, "1.0.0", ®istry_loc()).unwrap(),
assert_that(&res, contains(names(["foo", "bar"])));
}
+
+ #[test]
+ pub fn test_resolving_with_dev_deps() {
+ let mut reg = registry(vec!(
+ pkg!("foo" => "bar", dep("baz").as_dev()),
+ pkg!("baz" => "bat", dep("bam").as_dev()),
+ pkg!("bar"),
+ pkg!("bat")
+ ));
+
+ let res = resolve([dep("foo"), dep("baz").as_dev()], &mut reg).unwrap();
+
+ assert_that(&res, contains(names(["foo", "bar", "baz"])));
+ }
}